package com.yc.api.d1112;

import java.io.*;
import java.text.SimpleDateFormat;
import java.util.*;

public class Cmd {

    private String currentDir; // 当前目录
    private static final String OS_VERSION =
            "Microsoft Windows [版本 10.0.19045.4957]\n" +
            "(c) Microsoft Corporation。保留所有权利。"; // 操作系统版本

    private Scanner sc = new Scanner(System.in);
    public void start(){
        System.out.println(OS_VERSION);
        currentDir = System.getProperty("user.home");
        while(true){
            System.out.print(currentDir + ">");
            String command = sc.nextLine();
//            System.out.println("command = " + command);
            // dir   -a -b -c    c:\a
            // 命令     选项       文件
            // 正则表达式   \\s 表示一个空白符,包含空格   + 数量 1~n 个字符
            // split 拆分字符串, 返回字符串数组
            String[] splits = command.split("\\s+");
            String cmd = splits[0];  // 命令
            List<String> files = new ArrayList<>();
            // list 有序, 可重复
            List<String> items = new ArrayList<>();
            for (int i = 1; i < splits.length; i++) {
                if(splits[i].startsWith("/")){
                    items.add(splits[i]);
                } else {
                    files.add(splits[i]);
                }
            }
            // windows 的命令是忽略大小写
            if("cd".equalsIgnoreCase(cmd)){
                cd(items, files);
            } else if("dir".equalsIgnoreCase(cmd)){
                dir(items, files);
            } else if("copy".equalsIgnoreCase(cmd)){
                copy(items, files);
            } else {
                System.out.println("'"+cmd+"' 不是内部或外部命令，也不是可运行的程序");
                System.out.println("或批处理文件。");
            }
        }
    }

    public void cd(List<String> items, List<String> files){
        if(items.isEmpty() == false || files.size() > 1){
            System.out.println("系统找不到指定的路径。");
        } else if (files.isEmpty() || files.get(0).isBlank()){
            // isBlank 空白字符串
            System.out.println(currentDir + "\n");
        } else if (files.get(0).equals(".")){
            System.out.println();
        } else if (files.get(0).equals("..")) {
            // .. 回到上级目录
            if (currentDir.contains("\\")) {
                // 如果包含 \ => 回到到上级目录
                int i = currentDir.lastIndexOf("\\");
                currentDir = currentDir.substring(0, i);
                System.out.println();
            }
        } else {
            File dir = new File(currentDir, files.get(0));
            if(dir.exists() == false){
                System.out.println("系统找不到指定的路径。");
            } else {
                // 更新当前路径
                currentDir = dir.getAbsolutePath();
                System.out.println();
            }
        }

    }

    public void dir(List<String> items, List<String> files){
        // 查找结果集合
        File[] list = null;

        if(files.isEmpty() || files.get(0).isBlank()){
            // 没有文件
            // 查找当前目录所有文件
            File dir = new File(currentDir);
            list = dir.listFiles();
        } else {
            String file = files.get(0);
            // 查找指定文件
            File fileObj = new File(currentDir, file);
            if(fileObj.isFile()){
                // 展示文件
                list = new File[]{fileObj};
            } else if (fileObj.isDirectory()){
                // 展示目录里面的文件
                list = fileObj.listFiles();
            } else {
                // 既不是文件, 也不是目录 => 文件或目录不存在
                System.out.println("找不到文件");
                return;
            }
        }
        SimpleDateFormat sdf = new SimpleDateFormat("yyyy/MM/dd  HH:mm");
        for (File f : list) {
            String line = "%s %5s %10s %s\n";
            String date = sdf.format(new Date(f.lastModified()));
            String type = f.isDirectory() ? "<DIR>" : "";
            String size = f.isDirectory() ? "" :( f.length()==0 ? "" : ""+f.length() );
            String name = f.getName();
            System.out.printf(line, date,type,size,name);
        }
    }

    public void copy(List<String> items, List<String> files){
        if (files.isEmpty()) {
            System.out.println("请输入源文件!");
            return;
        }
        if (files.size() < 2) {
            System.out.println("请输入目标文件或目录!");
            return;
        }
        // 强行覆盖
        boolean y = items.contains("/y") || items.contains("/Y");

        String srcFile = files.get(0);
        String destFile = files.get(1);

        File srcFileObj = new File(currentDir, srcFile );
        if (srcFileObj.exists() == false) {
            System.out.println("源文件不存在!");
            return;
        }
        File destFileObj = new File(currentDir, destFile);
        if(destFileObj.exists() == false){
            // 不存在 => 直接复制文件
        } else if (destFileObj.isFile()) {
            // 文件
            if(y == false){
                String inputY = sc.nextLine();
                System.out.print("是否覆盖文件(Y/N):");
                if(inputY.equalsIgnoreCase("n")){
                    System.out.println("用户取消了复制!");
                    return;
                }
            }
            // 用于授权覆盖文件  => 直接复制文件
        } else {
            // 输入的是目录
            // 重新构建目标文件对象   => 直接复制文件
            destFileObj = new File(destFileObj, srcFileObj.getName());
        }

        try (FileInputStream fis = new FileInputStream(srcFileObj);
             FileOutputStream fos = new FileOutputStream(destFileObj);) {
            byte[] bytes = new byte[1024];
            int count;
            while((count = fis.read(bytes))>-1){
                fos.write(bytes,0,count);
            }
        } catch (IOException e) {
            e.printStackTrace();
//        } finally {
//            try{
//                fis.close();
//                fos.close();
//            } catch (IOException e1){
//                throw new RuntimeException("关闭流错误!", e1);
//            }
        }
        System.out.println("复制成功!");
    }

    public static void main(String[] args) {
        Cmd cmd = new Cmd();
        cmd.start();

    }

}
